package com.ruoyi.security.dto.backtest;

import lombok.Data;
import lombok.EqualsAndHashCode;

import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.List;

/**
 * 回测结果对象
 * 使用建造者模式构建
 * 
 * @author yeoman
 * @date 2025/2/4
 */
@EqualsAndHashCode(callSuper = true)
@Data
public class SecurityGridTradingBacktestResultDto extends SecurityGridTradingBacktestResultTradingStatisticsDto{
    /**
     * 标的代码
     */
    private String symbol;
    /**
     * 开始日期
     */
    private String startDate;
    /**
     * 结束日期
     */
    private String endDate;
    /**
     * 期初基准价
     */
     private BigDecimal initialBenchmarkPrice;
    /**
     * 初始持仓
     */
     private Integer initialPosition;
    /**
     * 初始市值
     */
     private BigDecimal initialMarketValue;
    /**
     * 期初总资产
     */
    private BigDecimal initialTotalAssets;

    /**
     * 涨跌幅类型
     * @see com.ruoyi.security.enums.RiseFallTypeEnum
     */
    private String riseFallType;

    /**
     * 股价每上涨（按价格差：分；按百分比：%）卖出
     */
    private BigDecimal perRiseValue;

    /**
     * 股价每下跌（按价格差：分；按百分比：%）买入
     */
    private BigDecimal perFallValue;

    /**
     * 单笔买入数量
     */
    private Integer singleBuyQuantity;

    /**
     * 单笔卖出数量
     */
    private Integer singleSellQuantity;

    /**
     * 价格下限（选填）
     */
    private BigDecimal priceFloor;

    /**
     * 价格上限（选填）
     */
    private BigDecimal priceCeiling;

    /**
     * 持仓区间下限（选填）
     */
    private Integer positionFloor;

    /**
     * 持仓区间上限（选填）
     */
    private Integer positionCeiling;

    /**
     * 倍数委托开关
     */
    private Boolean multipleMandateSwitch;

    /**
     * 交易日期详情列表
     */
    private List<DayDetail> dayDetailList = new ArrayList<>();

    @EqualsAndHashCode(callSuper = true)
    @Data
    public static class DayDetail extends SecurityGridTradingBacktestResultTradingStatisticsDto{
        /**
         * 交易日期
         */
        private String date;

        /**
         * 交易明细列表
         */
        private List<DayDetail.Detail> details = new ArrayList<>();

        @Data
        public static class Detail {
            /**
             * 交易时分
             */
            private String tradeTime;
            /**
             * 交易类型
             */
            private String tradeType;
            /**
             * 交易价格
             */
            private BigDecimal tradePrice;
            /**
             * 交易数量
             */
            private Integer tradeQuantity;
            /**
             * 持仓
             */
            private Integer position;
            /**
             * 交易手续费
             */
            private BigDecimal tradeChargeAmount;
        }
    }

}

